home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_3
/
reminder
/
src
/
arexx.c
next >
Wrap
C/C++ Source or Header
|
1993-04-19
|
4KB
|
144 lines
/* ARexx handling routines for ReminderCheck */
/* $Id: ARexx.c,v 1.2 1993/04/18 22:14:28 Matti_Rintala Exp $ */
#include <string.h>
#include <exec/types.h>
#include <exec/exec.h>
#include <rexx/storage.h>
#include <rexx/rxslib.h>
#ifdef __SASC
#include <proto/exec.h>
#include <proto/rexxsyslib.h>
#endif
#include "Constants.h"
#include "ARexx.h"
/* Calculate maximum length of the command line */
/* 'address "PORT" "COMMAND"' or rexxfilename "datestr" "textstr" */
#define MAXCMDLINE 10+AREXXPORTLEN+3+AREXXCOMLEN+2+TEXTLEN
/* Buffer for ARexx command */
static char cmdline[MAXCMDLINE+1];
/* Port for ARexx replys */
static struct MsgPort *MyPort = NULL;
struct Library *RexxSysBase = NULL;
/* initarexx initializes ARexx resources */
void initarexx(void) {
/* Open RexxSys library */
RexxSysBase = OpenLibrary(RXSNAME, 0);
/* Open port */
MyPort = CreateMsgPort();
}
/* releasearexx releases ARexx resources */
void releasearexx(void) {
/* Close RexxSys library */
if (RexxSysBase != NULL) {
CloseLibrary(RexxSysBase);
RexxSysBase = NULL;
}
/* Close port */
if (MyPort != NULL) {
DeleteMsgPort(MyPort);
MyPort = NULL;
}
}
/* makearexx handles the ARexx part of reminding */
void makearexx(struct EventNode *node, time_t *date) {
struct RexxMsg *msg;
char *buffer = cmdline; /* Pointer to command line */
int len;
struct MsgPort *aport;
/* Return if No Arexx mode event or if no message port or library */
if (((node->mode & ~GROUPEDMASK) != AREXXCMODE &&
(node->mode & ~GROUPEDMASK) != AREXXSMODE) ||
MyPort == NULL || RexxSysBase == NULL)
return;
if ((msg = CreateRexxMsg(MyPort, NULL, NULL)) != NULL) {
/* Now calculate correct argument string to buffer */
if ((node->mode & ~GROUPEDMASK) == AREXXCMODE) {
/* For ARexx command, argument is 'address "PORT" "COMMAND"' */
strcpy(buffer, "\'address \"");
buffer += 10;
strncpy(buffer, node->arexxport, AREXXPORTLEN);
len = strlen(node->arexxport);
buffer += (len > AREXXPORTLEN) ? AREXXPORTLEN : len;
*buffer++ = '\"';
*buffer++ = ' ';
*buffer++ = '\"';
strncpy(buffer, node->arexxcom, AREXXCOMLEN);
len = strlen(node->arexxcom);
buffer += (len > AREXXCOMLEN) ? AREXXCOMLEN : len;
*buffer++ = '\"';
*buffer++ = '\'';
}
else {
/* Script command is format scriptfile "datestr" "textstr" */
struct tm *d; /* For calculating datestr */
strncpy(buffer, node->arexxcom, AREXXCOMLEN);
len = strlen(node->arexxcom);
buffer += (len > AREXXCOMLEN) ? AREXXCOMLEN : len;
*buffer++ = ' ';
*buffer++ = '\"';
d = localtime(date); /* Convert date to correct format */
buffer += strftime(buffer, 16, "%a %d-%b-%Y", d); /* Print datestr */
*buffer++ = '\"';
*buffer++ = ' ';
*buffer++ = '\"';
strncpy(buffer, node->text, TEXTLEN);
len = strlen(node->text);
buffer += (len > TEXTLEN) ? TEXTLEN : len;
*buffer++ = '\"';
}
/* Calculate length of argument string */
len = (int)(buffer - cmdline);
/* Make ARexx argument string */
if ((msg->rm_Args[0] = CreateArgstring(cmdline, len)) != NULL) {
msg->rm_Action = RXCOMM | RXFF_NOIO; /* ARexx command flags */
/* Then find AREXX port and send message */
Forbid();
if ((aport = FindPort("AREXX")) != NULL)
PutMsg(aport, (struct Message *)msg);
Permit();
/* If sending was succesfull, wait for reply and remove it */
if (aport) {
WaitPort(MyPort);
GetMsg(MyPort);
}
ClearRexxMsg(msg, 1); /* Clear message */
}
DeleteRexxMsg(msg); /* Delete message */
}
}